<?php
/**
 *路径分隔符
 */
if (! defined('OS_PATH_SEP')) {
    define('OS_PATH_SEP', DIRECTORY_SEPARATOR);
}
/**
 *项目根路径
 */
if (! defined('PROJECT_ROOT')) {
    define('PROJECT_ROOT', dirname(dirname(__FILE__)) . OS_PATH_SEP);
}
// -----------------------------------------------------------------------------
/**
 *导入文件或包
 *
 *该函数是框架的一个核心函数.
 *用于导入框架内的文件或者包.
 *并保证相同文件不会被重复导入.
 *
 *@param string $s package path
 *@staticvar array $imported_file
 *@return void
 */
function sdk_import ($s)
{
    static $imported_file = array();
    if (! empty($imported_file[$s]) && $imported_file[$s] === 1) {
        //如果文件已经导入
        //则不再重复导入文件
        return TRUE;
    }
    $path = $s;
    //导入包的初始化文件 : __init__.php	
    $path = str_replace('~', '__init__', $path);
    //将点号转换为路径分隔符
    $path = str_replace('.', OS_PATH_SEP, $path);
    if (substr($path, 0, 1) === '@') {
        //从app路径中导入
        $include_file = SDK_APP_ROOT . substr($path, 2) . '.php';
    } elseif (substr($path, 0, 1) === '&') {
        $include_file = SDK_OA_LIB . substr($path, 2) . '.php';
    } elseif (substr($path, 0, 1) === '*') {
        $include_file = SDK_OA_SDK . substr($path, 2) . '.php';
    } else {
        //从项目根路径导入
        $include_file = PROJECT_ROOT . $path . '.php';
    }
    if (! file_exists($include_file)) {
        sdk_show_msg("文件不存在 : {$s}");
    }
    $imported_file[$s] = 1;
    return include_once ($include_file);
}
// -----------------------------------------------------------------------------
/**
 *导入配置文件
 *
 *@param string $s 配置名称
 *@staticvar array $imported_file 已导入文件列表
 *@staticvar array $config_pool 配置池
 *@return void
 */
function sdk_import_config ($s)
{
    //$config_name = $s;
    static $imported_file = array();
    static $config_pool = array();
    //使用配置名称作为键名
    $key = "__{$s}__";
    if (! empty($imported_file[$key]) && $imported_file[$key] === 1) {
        //如果文件已经导入,则不再重复导入文件
        //返回配置文件的返回值
        return $config_pool[$key];
    }
    if (strpos($s, '/') !== FALSE) {
        //在配置名称中包含路径分隔符,处理子路径
        $path_array = explode('/', $s);
        $config_name = array_pop($path_array);
        $config_sub_path = implode(OS_PATH_SEP, $path_array);
        $include_file = SDK_CONFIGS_PATH . $config_sub_path . OS_PATH_SEP . $config_name . '.conf.php';
    } else {
        $config_name = $s;
        $include_file = SDK_CONFIGS_PATH . $config_name . '.conf.php';
    }
    if (! file_exists($include_file)) {
        sdk_show_msg("配置文件 {$s} 不存在");
    }
    $config = include ($include_file);
    $imported_file[$key] = 1;
    $config_pool[$key] = $config;
    return $config;
}
/**
 *获取配置项
 *
 *该函数与fetch_config不同的是采用了层次获取配置的参数
 *并且可以自动导入配置文件
 *例如 fetch_config2('out.res.prefix');
 *
 *@param string $name 层次类型的配置名称
 *@staticvar array $config_pool 配置池
 *return mixed
 */
function sdk_fetch_config ($name)
{
    @list ($config_file, $config_path) = explode('.', $name, 2);
    if (empty($config_file)) {
        sdk_show_msg("Name参数非法 {$name}");
    }
    if (empty($config_path)) {
        //返回配置文件的返回值
        return sdk_import_config($config_file);
    }
    $config = sdk_import_config($config_file);
    if (! is_array($config)) {
        sdk_show_msg("请检查配置文件 {$config_file} 的语法", '获取配置错误');
    }
    //global $config;
    $pieces = explode('.', $config_path);
    $ret = $config;
    foreach ($pieces as $piece) {
        $tmp[] = $piece;
        if (is_array($ret) && isset($ret[$piece])) {
            $ret = $ret[$piece];
        } else {
            /*
			$path = implode('.', $tmp);
			sdk_show_msg("配置 {$path} 未定义,在配置文件 {$config_file} 中", '配置获取错误');
			*/
            $ret = NULL;
        }
    }
    return $ret;
}
/**
 *显示提示信息
 *
 *@param string $msg 提示信息
 *@param string $title 提示标题 
 */
function sdk_show_msg ($msg)
{
    # 改用框架函数
    die($msg);
}
/**
 * 数组转码
 * @param array array $arr 数据
 * @param string $in_charset 数据原来编码
 * @param string $out_charset 转码后编码
 * 
 * @return array
 */
function iconv_array ($arr, $in_charset = 'UTF-8', $out_charset = 'GB2312')
{
    if (! is_array($arr)) {
        return $arr;
    }
    foreach ($arr as $k => $val) {
        $arr[$k] = iconv($in_charset, $out_charset, $val);
    }
    return $arr;
}
?>